package br.com.foxinline.manager.itbi;

import br.com.foxinline.modelo.Bairro;
import br.com.foxinline.modelo.ConfigItbi;
import br.com.foxinline.modelo.GrupoBairro;
import br.com.foxinline.servico.BairroServico;
import br.com.foxinline.servico.CidadeServico;
import br.com.foxinline.servico.ConfigItbiServico;
import br.com.foxinline.servico.GrupoBairroServico;
import br.com.foxinline.servico.PrefeituraServico;
import br.com.foxinline.util.Msg;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.DualListModel;

/**
 *
 * @author nayra
 */
@ManagedBean
@ViewScoped
public class ManagerConfigItbi implements Serializable {

    @EJB
    private BairroServico bairroServico;
    @EJB
    private CidadeServico cidadeServico;
    @EJB
    private ConfigItbiServico configItbiServico;
    @EJB
    private GrupoBairroServico grupoBairroServico;
    @EJB
    private PrefeituraServico prefeituraServico;
    private DualListModel<Bairro> dualBairros;
    private List<Bairro> bairrosDisponiveis;
    private ConfigItbi configItbi;
    private GrupoBairro grupoBairro;

    @PostConstruct
    public void init() {
        List<ConfigItbi> list = configItbiServico.findAll();
        this.configItbi = new ConfigItbi();
        if (!list.isEmpty()) {
            this.configItbi = list.get(0);
            this.configItbi.setGruposBairros(grupoBairroServico.findConfigItbi(configItbi));
            for (GrupoBairro gb : this.configItbi.getGruposBairros()) {
                gb.setBairros(bairroServico.findGrupoBairro(gb));
            }
        }
        grupoBairro = new GrupoBairro();
        atualizaBairrosDisponiveis();
        dualBairros = new DualListModel<Bairro>(this.bairrosDisponiveis, new ArrayList<Bairro>());
    }

    public void addGrupoBairro() {
        if (this.configItbi.getGruposBairros() == null) {
            this.configItbi.setGruposBairros(new ArrayList<GrupoBairro>());
        }
        grupoBairro.setBairros(dualBairros.getTarget());
        this.configItbi.getGruposBairros().add(grupoBairro);
        grupoBairro = new GrupoBairro();
        this.dualBairros.setTarget(new ArrayList<Bairro>());
    }

    public void editarGrupoBairro(GrupoBairro grupoBairro) {
        this.grupoBairro = grupoBairro;
        this.dualBairros.setTarget(grupoBairro.getBairros());
        this.configItbi.getGruposBairros().remove(grupoBairro);
    }

    public void removerGrupoBairro(GrupoBairro grupoBairro) {
        this.configItbi.getGruposBairros().remove(grupoBairro);
        this.dualBairros.getSource().addAll(grupoBairro.getBairros());
    }

    public void salvar() {
        if (!this.dualBairros.getSource().isEmpty()) {
            Msg.messagemWarn("Associe todos os bairros a um grupo!");
        } else {
            try {
                if (configItbi.getId() == null) {
                    this.configItbiServico.save(configItbi);
                    configItbi = new ConfigItbi();
                } else {
                    this.configItbiServico.update(configItbi);
                }

                Msg.messagemInfo(Msg.SuccessFull);
                init();

            } catch (Exception e) {
                Msg.messagemError(Msg.Failure);
            }
        }
    }

    private void atualizaBairrosDisponiveis() {
        this.bairrosDisponiveis = bairroServico.findCidade(new Bairro(), this.prefeituraServico.find().getEndereco().getBairroDne().getCidade());
        List<Bairro> bairrosComGrupo = grupoBairroServico.findBairroComGrupo();
        if (bairrosComGrupo != null) {
            this.bairrosDisponiveis.removeAll(bairrosComGrupo);
        }
    }

    public List<Bairro> getBairrosDisponiveis() {
        return bairrosDisponiveis;
    }

    public ConfigItbi getConfigItbi() {
        return configItbi;
    }

    public DualListModel<Bairro> getDualBairros() {
        return dualBairros;
    }

    public GrupoBairro getGrupoBairro() {
        return grupoBairro;
    }

    public void setBairrosDisponiveis(List<Bairro> bairrosDisponiveis) {
        this.bairrosDisponiveis = bairrosDisponiveis;
    }

    public void setConfigItbi(ConfigItbi configItbi) {
        this.configItbi = configItbi;
    }

    public void setDualBairros(DualListModel<Bairro> dualBairros) {
        this.dualBairros = dualBairros;
    }

    public void setGrupoBairro(GrupoBairro grupoBairro) {
        this.grupoBairro = grupoBairro;
    }
}
